package com.wuxi.common.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;

public class ReqCodeUtils {

    private static final Integer REQ_CODE_LENGTH = 15;

    // 时间格式：年月日时分秒毫秒（17位）
    private static final SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("yyyyMMddHHmmssSSS");

    // 随机数位数
    private static final int RANDOM_LENGTH = 6;

    // 自定义盐值，用于增强哈希唯一性（可根据实际业务修改）
    private static final String SALT = "req_code_salt";

    /**
     * 生成请求编码（结合当前时间）
     * 格式：时间戳（17位） + 随机数（6位） + 哈希尾缀（4位）
     */
    public static String generateRequestCode() {
        // 1. 获取当前时间戳字符串
        String timeStr = TIME_FORMATTER.format(new Date());

        // 2. 生成指定长度的随机数
        String randomStr = generateRandomNum();

        // 3. 生成哈希尾缀（增强唯一性）
        String hashSuffix = generateHashSuffix(timeStr, randomStr);

        // 4. 拼接结果
        return timeStr + randomStr + hashSuffix;
    }

    /**
     * 生成指定长度的随机数字字符串
     */
    private static String generateRandomNum() {
        // 使用ThreadLocalRandom确保多线程安全性
        ThreadLocalRandom random = ThreadLocalRandom.current();
        StringBuilder sb = new StringBuilder(REQ_CODE_LENGTH);
        for (int i = 0; i < REQ_CODE_LENGTH; i++) {
            sb.append(random.nextInt(10)); // 生成0-9的随机数
        }
        return sb.toString();
    }

    /**
     * 生成哈希尾缀（基于时间和随机数）
     */
    private static String generateHashSuffix(String timeStr, String randomStr) {
        // 组合原始字符串（加入盐值增强唯一性）
        String original = timeStr + randomStr + SALT;
        // 计算哈希值（使用32位哈希，取后4位）
        int hash = original.hashCode();
        // 转为正数并取后4位
        String suffix = String.format("%04d", Math.abs(hash) % 10000);
        return suffix;
    }
}
